# 数字系统转换器
# 题目内容
在一个特殊的数学系统中,每个数字都有其独特的表示方式。给定两个不同的数字字符集和一个数字字符串,你需要将这个数字从一个字符系统转换到另一个字符系统。实现一个函数,将使用源字符集表示的数字转换为使用目标字符集表示的数字。
补充说明:
- $1 \le num.length \le 100$
- $2 \le sourceDigits.length \le 36$
- $2 \le targetDigits.length \le 36$
sourceDigits和targetDigits由不同的字符组成,且不包含重复字符num中的所有字符都存在于sourceDigits中- 输入保证是有效的,不会出现非法字符
- 转换结果不应包含前导零,除非数字本身就是 $0$
# 样例
# 样例 1
输入
101
01
0123456789
1
2
3
2
3
输出
5
1
说明: 二进制 "101" 转换为十进制是 "5"。
# 样例 2
输入
ff
0123456789abcdef
0123456789
1
2
3
2
3
输出
255
1
说明: 十六进制 "ff" 转换为十进制是 "255"。
# 样例 3
输入
100
01
0123456789abcdef
1
2
3
2
3
输出
4
1
说明: 二进制 "100" 转换为十六进制是 "4"。
# 样例 4
输入
7
0123456789
01
1
2
3
2
3
输出
111
1
说明: 十进制 "7" 转换为二进制是 "111"。
# 样例 5
输入
10012
01234
012
1
2
3
2
3
输出
212102
1
说明: 五进制 "10012" 转换为三进制是 "212102"。
# 代码
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let lines = [];
rl.on('line', (input) => {
lines.push(input);
if (lines.length === 3) {
const num = lines[0].trim();
const sourceDigits = lines[1].trim();
const targetDigits = lines[2].trim();
let s10 = 0n;
const l1 = BigInt(sourceDigits.length);
for(let i=0; i<num.length; i++) {
s10 = s10 * l1 + BigInt(sourceDigits.indexOf(num[i]));
}
let ans = '';
const l2 = BigInt(targetDigits.length);
while(s10 > 0n) {
const i = s10%(l2);
ans = targetDigits[i] + ans;
s10 = BigInt(s10 / l2);
}
console.log(ans);
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29